﻿using System;
using System.Data;
using System.Configuration;
using System.IO;
using System.Xml;

namespace UpdateProcess
{
	/// <summary>
	/// XML 操作基类
	/// </summary>
	public class XmlProvider
	{
		#region 读取XML到DataSet
		/**************************************************
         * 函数名称:GetXml(string strXmlPath)
         * 功能说明:读取XML到DataSet
         * 参    数:strXmlPath:xml文档路径
         * 使用示列:
         *          using EC; //引用命名空间
         *          string strXmlPath = Server.MapPath("/EBDnsConfig/DnsConfig.xml"); //获取xml路径
         *          DataSet ds = EC.XmlObject.GetXml(strXmlPath); //读取xml到DataSet中
         ************************************************/
		/// <summary>
		/// 功能:读取XML到DataSet中
		/// </summary>
		/// <param name="strXmlPath">xml路径</param>
		/// <returns>DataSet</returns>
		public static DataSet GetXml(string strXmlPath)
		{
			DataSet ds = new DataSet();
			ds.ReadXml(@strXmlPath);
			return ds;
		}
		#endregion

		#region 读取xml文档并返回一个节点
		/**************************************************
         * 函数名称:ReadXmlReturnNode(string strXmlPath,string strNodeName)
         * 功能说明:读取xml文档并返回一个节点:适用于一级节点
         * 参    数: strXmlPath:xml文档路径;strNodeName 返回的节点名称
         * 适应用Xml:<?xml version="1.0" encoding="utf-8" ?>
         *           <root>
         *               <dns1>ns1.everdns.com</dns1>
         *          </root>
         * 使用示列:
         *          using EC; //引用命名空间
         *          string strXmlPath = Server.MapPath("/EBDnsConfig/DnsConfig.xml"); //获取xml路径
         *          Response.Write(XmlObject.ReadXmlReturnNode(strXmlPath, "mailmanager"));
         ************************************************/
		/// <summary>
		/// 读取xml文档并返回一个节点:适用于一级节点
		/// </summary>
		/// <param name="strXmlPath">xml路径</param>
		/// <param name="NodeName">节点</param>
		/// <returns></returns>
		public static string ReadXmlReturnNode(string strXmlPath, string strNodeName)
		{
			XmlDocument docXml = new XmlDocument();
			docXml.Load(@strXmlPath);
			XmlNodeList xn = docXml.GetElementsByTagName(strNodeName);
			return xn.Item(0).InnerText.ToString();
		}
		#endregion

		#region 查找数据,返回一个DataSet
		/**************************************************
         * 函数名称:GetXmlData(string strXmlPath, string strNodePath)
         * 功能说明:查找数据,返回当前节点的所有下级节点,填充到一个DataSet中
         * 参    数:strXmlPath:xml文档路径;strNodePath:当前节点的路径
         * 使用示列:
         *          using EC; //引用命名空间
         *          string strXmlPath = Server.MapPath("/EBDomainConfig/DomainConfig.xml"); //获取xml路径
         *          DataSet ds = new DataSet();
         *          ds = XmlObject.GetXmlData(strXmlPath, "root/items");//读取当前路径
         *          this.GridView1.DataSource = ds;
         *          this.GridView1.DataBind();
         *          ds.Clear();
         *          ds.Dispose();
         * Xml示例:
         *         <?xml version="1.0" encoding="utf-8" ?>
         *            <root>
         *              <items name="xinnet">
         *                <url>http://www.paycenter.com.cn/cgi-bin/</url>
         *                <port>80</port>
         *              </items>
         *            </root>
         ************************************************/
		/// <summary>
		/// 查找数据,返回当前节点的所有下级节点,填充到一个DataSet中
		/// </summary>
		/// <param name="strXmlPath">xml文档路径</param>
		/// <param name="strNodePath">节点的路径:根节点/父节点/当前节点</param>
		/// <returns></returns>
		public static DataSet GetXmlData(string strXmlPath, string strNodePath)
		{
			XmlDocument objXmlDoc = new XmlDocument();
			objXmlDoc.Load(strXmlPath);
			DataSet ds = new DataSet();
			StringReader read = new StringReader(objXmlDoc.SelectSingleNode(strNodePath).OuterXml);
			ds.ReadXml(read);
			return ds;
		}

		#endregion

		#region 更新Xml节点内容
		/**************************************************
         * 函数名称:XmlNodeReplace(string strXmlPath,string strNodeName,string strContent)
         * 功能说明:更新Xml节点内容
         * 参    数:strXmlPath:xml文档路径;strNodeName:当前节点的路径;strContent:内容
         * 使用示列:
         *          using EC; //引用命名空间
         *          string strXmlPath = Server.MapPath("/EBDomainConfig/DomainConfig.xml"); //获取xml路径
         *          XmlObject.XmlNodeReplace(strXmlPath, "root/test", "56789");  //更新节点内容
         ************************************************/
		/// <summary>
		/// 更新Xml节点内容
		/// </summary>
		/// <param name="strXmlPath">xml路径</param>
		/// <param name="strNodeName">要更换内容的节点:节点路径根节点/父节点/当前节点</param>
		/// <param name="strContent">新的内容</param>
		public static void XmlNodeReplace(string strXmlPath, string strNodeName, string strContent)
		{
			XmlDocument objXmlDoc = new XmlDocument();
			objXmlDoc.Load(strXmlPath);
			objXmlDoc.SelectSingleNode(strNodeName).InnerText = strContent;
			objXmlDoc.Save(strXmlPath);

		}

		#endregion

		#region 删除XML节点和此节点下的子节点
		/**************************************************
         * 函数名称:XmlNodeDelete(string strXmlPath,string strNodeName)
         * 功能说明:删除XML节点和此节点下的子节点
         * 参    数:strXmlPath:xml文档路径;strNodeName:当前节点的路径;
         * 使用示列:
         *          using EC; //引用命名空间
         *          string strXmlPath = Server.MapPath("/EBDomainConfig/DomainConfig.xml"); //获取xml路径
         *          XmlObject.XmlNodeDelete(strXmlPath, "root/test");  //删除当前节点
         ************************************************/
		/// <summary>
		/// 删除XML节点和此节点下的子节点
		/// </summary>
		/// <param name="strXmlPath">xml文档路径</param>
		/// <param name="strNodeName">节点路径</param>
		public static void XmlNodeDelete(string strXmlPath, string strNodeName)
		{
			XmlDocument objXmlDoc = new XmlDocument();
			objXmlDoc.Load(strXmlPath);
			string mainNode = strNodeName.Substring(0, strNodeName.LastIndexOf("/"));
			objXmlDoc.SelectSingleNode(mainNode).RemoveChild(objXmlDoc.SelectSingleNode(strNodeName));
			objXmlDoc.Save(strXmlPath);
		}

		#endregion

		#region 插入一个节点和此节点的字节点
		/**************************************************
         * 函数名称:XmlInsertNode(string strXmlPath, string MailNode, string ChildNode, string strElement,string strContent)
         * 功能说明:插入一个节点和此节点的字节点
         * 参    数:strXmlPath:xml文档路径;MailNode:当前节点的路径;ChildNode:新插入的节点;strElement:插入节点的子节点;strContent:子节点的内容
         * 使用示列:
         *          using EC; //引用命名空间
         *          string strXmlPath = Server.MapPath("/EBDomainConfig/DomainConfig.xml"); //获取xml路径
         *          XmlObject.XmlInsertNode(strXmlPath, "root/test","test1","test2","测试内容");  //插入一个节点和此节点的字节点
         * 生成的XML格式为
         *          <test>
         *               <test1>
         *                    <test2>测试内容</test2>
         *                </test1>
         *            </test>
         ************************************************/
		/// <summary>
		/// 插入一个节点和此节点的字节点
		/// </summary>
		/// <param name="strXmlPath">xml路径</param>
		/// <param name="MailNode">当前节点路径</param>
		/// <param name="ChildNode">新插入节点</param>
		/// <param name="strElement">插入节点的子节点</param>
		/// <param name="strContent">子节点的内容</param>
		public static void XmlInsertNode(string strXmlPath, string MailNode, string ChildNode, string strElement, string strContent)
		{
			XmlDocument objXmlDoc = new XmlDocument();
			objXmlDoc.Load(strXmlPath);
			XmlNode objRootNode = objXmlDoc.SelectSingleNode(MailNode);
			XmlElement objChildNode = objXmlDoc.CreateElement(ChildNode);
			objRootNode.AppendChild(objChildNode);
			XmlElement objElement = objXmlDoc.CreateElement(strElement);
			objElement.InnerText = strContent;
			objChildNode.AppendChild(objElement);
			objXmlDoc.Save(strXmlPath);
		}

		#endregion

	}
}